#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

#if 0
/*
    dup 函数
dup 通过复制一个文件描述符，返回一个新的文件描述符，该新文件描述符是当前最小的未使用的文件描述符。
*/
int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    int new_fd = dup(fd);
    if (new_fd == -1) {
        perror("dup");
        close(fd);
        return 1;
    }

    // Now new_fd is a copy of fd and can be used to refer to the same file
    // Perform operations on new_fd...

    close(fd);
    close(new_fd);
    return 0;
}
#endif
/*
    dup2 函数
dup2 将一个文件描述符复制到一个指定的文件描述符。如果指定的文件描述符已经被打开，dup2 会首先关闭它。
dup2 和 dup 不同之处在于，你可以指定目标文件描述符。
*/
#if 0
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main() {
    int fd = open("example.txt", O_RDWR);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    int target_fd = 5; // Assuming 5 is not used
    if (dup2(fd, target_fd) == -1) {
        perror("dup2");
        close(fd);
        return 1;
    }

    // Now target_fd is a copy of fd and can be used to refer to the same file
    // Perform operations on target_fd...

    close(fd);
    close(target_fd);
    return 0;
}

#endif
/*
    区别总结
返回值：

dup：返回新的文件描述符。
dup2：返回目标文件描述符。
目标文件描述符：

dup：系统自动选择当前最小的未使用的文件描述符。
dup2：用户可以指定目标文件描述符。
文件描述符关闭：

dup：不会关闭任何文件描述符。
dup2：如果目标文件描述符已经被打开，会首先关闭它。
*/
int main() 
{
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) 
    {
        perror("open");
        return 1;
    }

    if (dup2(fd, STDOUT_FILENO) == -1) 
    {
        perror("dup2");
        close(fd);
        return 1;
    }

    close(fd);

    // Now stdout is redirected to "output.txt"
    printf("This will be written to the file.\n");

    return 0;
}
/*
    在这个例子中，dup2 将标准输出 (STDOUT_FILENO) 重定向到 output.txt 文件，
    因此 printf 的输出将写入文件而不是终端。
*/

